#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置文本框名称
    this->setWindowTitle(QStringLiteral("高业晶·兢兢业业·勤勤恳恳·认认真真·辛辛苦苦做的文本编辑器"));
    //调用该方法的窗口对象
    // 访问到资源
    QIcon icon(":/img/img/note.png");
    // 设置图标
    this->setWindowIcon(icon);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//“打开”的槽函数
void MainWindow::on_actionopenDakai_triggered()
{
   // QMessageBox::information(this,tr("Information"),tr("靓仔打开了文件"));


/*
    QString fileName = QFileDialog::getOpenFileName(this,
                                                    //QFileDialog::getFileName函数用于弹出一个文件对话框让用户选取文件
                                                    //当前窗口this作为父窗体，对话框的标题("Open File")，

                                                     tr("Open File"),
                                                     QDir::homePath(),
                                                    //初始目录为用户的注册目录,QDir::homePath()

                                                     tr("All Files (*)"));
     if (!fileName.isEmpty()) {
         qDebug() << "Selected file:" << fileName;
     }
*/

    QString fileName = QFileDialog::getOpenFileName(this,
                                                    tr("Open Text File"),
                                                    QDir::homePath(),
                                                    tr("Text files (*.txt)"));
/*
 * QFileDialog::getOpenFileName
示例:括号里的参数分别是：指定父类窗口部件、对话框使用的标题、默认打开后显示的目录(即告诉它从哪一级目录开始)、右下角的文件过滤器。
    QString file_name = QFileDialog::getOpenFileName(NULL,"标题","./",,"*.xml");
    qDebug() << file_name;
*/

    if (!fileName.isEmpty()) {
        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly)) {
            // 尝试使用UTF-8编码读取文件
            QTextStream in(&file);
            in.setCodec("UTF-8");
/*QTextStream的setCodec函数被用来设置编码为"UTF-8"。
 * 这样，即使文件没有BOM（Byte Order Mark）,QTextStream也能够正确地处理UTF-8编码的文本。
 * 如果文件不是UTF-8编码，你可能需要进一步检查或尝试其他编码直到找到正确的编码。*/

            // 读取文件内容
            QString text = in.readAll();

            // 将文件内容显示在QTextEdit上
            ui->textEdit->setText(text);

            // 在控制台打印选中的文件路径
            qDebug() << "Selected file path:" << fileName;

            file.close();
        } else {
            // 如果文件打开失败，打印错误信息
            qDebug() << "Failed to open file:" << file.errorString();
        }
    }

}

//“新建”的槽函数
void MainWindow::on_actionXinjian_triggered()
{
    //QMessageBox::warning(NULL,"警告","文本将该被清除，确定继续吗？",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);

        QMessageBox::StandardButton reply;
        reply = QMessageBox::warning(NULL, "警告", "文本将被清除，确定继续吗？", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        if (reply == QMessageBox::Yes) {
            // QtextEdit->clear();
            //访问文本编辑控件
            ui->textEdit->clear();
        }
}

//“保存”的槽函数
void MainWindow::on_actionBaocun_triggered()
{
    // 打开文件保存对话框，默认位置为用户主目录，文件过滤类型为所有文件(*.*)
    QString fileName = QFileDialog::getSaveFileName(this,
                                                     tr("Save As"),
                                                     QDir::homePath(),
                                                     tr("Text files(*.txt)"));
    //括号里的参数分别是：指定父类窗口部件、对话框使用的标题、默认打开后显示的目录(即告诉它从哪一级目录开始)、右下角的文件过滤器。


    if (!fileName.isEmpty()) { // 用户取消保存则不会返回文件名
        QFile file(fileName);
        if(file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            QTextStream out(&file);

            // 把QTextEdit的文字内容保存为文件内容
            out << ui->textEdit->toPlainText();

            file.close(); // 关闭文件

            // 控制台输出保存成功的文件路径
            qDebug() << "File saved successfully at:" << fileName;
        } else {
            // 文件无法打开时的错误处理
            QMessageBox::warning(this, tr("Error"), tr("Cannot write file %1:\n%2.")
                                 .arg(QDir::toNativeSeparators(fileName), file.errorString()));
        }
    }
}

//“撤销、重置，复制、剪切、粘贴、”
void MainWindow::on_actionChexiao_triggered()
{
    ui->textEdit->undo();
}

void MainWindow::on_actionChongzuo_triggered()
{
    ui->textEdit->redo();
}

void MainWindow::on_actionFuzhi_triggered()
{
    ui->textEdit->copy();
}

void MainWindow::on_actionJianqie_triggered()
{
    ui->textEdit->cut();
}

void MainWindow::on_actionZhantie_triggered()
{
    ui->textEdit->paste();
}

//字体
void MainWindow::on_actionXhx_triggered()
{
    {
        bool ok;
        QFont font = QFontDialog::getFont(&ok, this);
        if (ok) {
            ui->textEdit->setFont(font);
        }
    }
}
/*
  1.函数定义: void MainWindow::on_actionXhx_triggered()这个函数名为on_actionXhx_triggered，属于MainWindow类，当与之关联的界面元素（如菜单项或按钮）被触发时调用。
  2.代码块函数体内有一个代码块，虽然使用了一对大括号，但在C++中这并不构成功能性的区别，仅用于组织代码视觉上。
  3.局部变量声明与初始化bool ok;
声明了一个布尔型变量ok，用于接收字体对话框返回的结果状态。
  4.调用QFontDialog::getFont()方法QFont font = QFontDialog::getFont(&ok, this);
使用QFontDialog::getFont对话框让用户选择一个字体。这个方法需要一个指向布尔型变量的指针&ok作为第一个参数，用来接收是否成功选择了字体的信息，并且需要一个父窗口对象this作为第二个参数。
  5.条件判断if (ok) {
    ui->textEdit->setFont(font);
}

如果用户在对话框中点击了确定并且选择了字体，即ok为真，则会将用户选择的字体应用到ui->textEdit控件上。这里ui通常是一个包含所有界面元素的指针，而textEdit是指向文本编辑框的对象。
*/

//颜色
void MainWindow::on_actionZiti_triggered()
{
    //选取颜色
    QColor color = QColorDialog::getColor(Qt::black, this);
    //验证颜色选取的有效性
       if (color.isValid()) {
           //设置字体格式
           QTextCharFormat fmt;//QTextCharFormat对象
           fmt.setForeground(color);//设置fmt的前景色属性为用户选择的颜色color
           //合并当前字符格式
           ui->textEdit->mergeCurrentCharFormat(fmt);
       }
}


void MainWindow::on_actionban_triggered()
{
    QMessageBox::about(NULL,"版权声明©","山西农业大学软件学院\n"
                                    "软件2214z班 高业晶\n"
                                    "学号：20221614644\n"
                                    "制作");
}
